<?php

class fDumpDatabase extends aFeature {


   public function __construct() {
      $this->_acl = new AccessControlList();
      $this->_acl->setGranted(7); 
   }

   public static function getTocEntry() {
      return "Base de données";
   }

   public static function getRealName() {
		return "Exportation de la base de données";
	}
	
	public static function getSemantic() {
		$res  = "Cette fonctionalité permet d'effectuer une sauvegarde ou une restauration de la base de données Balloon sur le serveur";
		return $res;
	}


   protected function run() {
     
     $action = PropRetriever::getProp($_POST,"action");
     $page = $this->displayForm();
     
     if ($action == "export") {
       $sql = PropRetriever::getProp($_POST,"sql");
       if ($sql != "")
       	 $this->export(False);
       else
     	   $this->export(True);
		 }
		 else if ($action == "reload") {
     	 $page .= $this->reload();
     }
     
		 return $page;
   }
   

	private function reload() {
		$page = "<h2> Résultat du rechargement </h2>";
	  // Recuperation de ce qui a ete charge.
	  
	  $file = new UploadedFile("sqlFile");
	  $readData = $file->readAFile();
		
	  if ($readData[0] == True) {
	  	// On peut charger, le fichier est present et lut :
	  	$status = Database::reload($readData[1]);
			$fileName = $file->getOriginalName();
	  	if ($status == 0) {
		  	$page .= "<p align=\"center\">";
		  	$page .= "Le fichier <code>$fileName</code> a été envoye dans le moteur de base avec succès!";
	  		$page .= "</p>";
	  	}
	  	else {
	  		$page .= "<p align=\"center\">";
		  	$page .= "<span class=\"error\" > Une erreur est survenue durant le traitement du fichier <code>$fileName</code> par le moteur de base :'(";
	  		$page .= "</span></p>";
	  	}
	  }
	  else {
	  	$page .= "<h3> Une erreur est survenue ! </h3>";
	  	$page .= "<p align=\"center\"> <span class=\"error\">";
	  	$page .= $readData[1];
	  	$page .= "</span></p>";
	  }
	  return $page;
	}

	private function export($doCompression) {
	 	
	 	// Exportation SQL
	 	$dump = Database::export();
	 	
	 	// fichier temporaire sur le serveur
 		$fileName = tempnam("/tmp","balloon");
 		// Nom du fichier a enregistrer chez le client
 		$attach = "Balloon-".date('Y-m-d--H-i').".sql";
 		
 		if ($doCompression) {
 		
			$bz = bzopen($fileName,"w");
 			bzwrite($bz,$dump);
 			bzclose($bz); 		
 			
 		  $attach .= ".bz2"; // On compresse ==> on change l'extension.	
 			
 			//Envoi des headers spécifiques :
 			header('Content-Type: application/x-bzip');
 		}
 		else {
 		
 		  $fp = fopen($fileName,"w");
 		  fwrite($fp,$dump);
 		  fclose($fp);
 		  
 		  //Envoi des headers spécifiques :
 	    header('Content-Length: ' + filesize($fileName));
 		}
 		
 		// Envoi de sheaders globaux
    header('Content-Length: ' + filesize($fileName));
 		header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
  	header("Content-Disposition: attachment; filename=\"".$attach."\"");
  	header('Pragma: no-cache');
  	
 		
 		// envoi du contenu du fichier :
		readfile($fileName);
    
    // Fermeture des ressources temporaires, puis sortie du script.
    unlink($fileName);
    exit();
	}

   
   private function displayForm() {
   
   	$maxFileSize = MAX_FILE_SIZE;
   	$mnemonic = MAX_FILE_SIZE_IN_MO;
   	
   	$page = <<<EOS
<h1> Gestion de la base de données </h1>

	<div align="center" >
	
	<table>
	<tr> 
	
	<td>
    <form method="post" accept-charset="utf-8" action="?export" >
    <fieldset>
      <legend> Exporter la base de données </legend>
      <br />
   <input type="submit" name="sql"  value="Exporter au format SQL" class="button" 
           onClick="exportDb();"/>
      
      <br /> <br />
      <input type="submit" name="bz2"  value="Exporter au format BZ2" class="button" 
           onClick="exportDb();"/>
      
      <br /> <br />
      <input type="hidden" name="action" value="export" />
    </fieldset>
    </form>
		</td>
		
		<td>
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    </td>
    <td>
    <form method="post" enctype="multipart/form-data" 
    			action="${_SERVER['PHP_SELF']}?reload" >
    <fieldset>
      <legend> Charger un fichier de sauvegarde </legend>
      <div align="left"> 
      	<code> &nbsp; Fichier de Sauvegarde (${mnemonic} Mo max)</code> :
      </div> <br />
      <input type="hidden" name="MAX_FILE_SIZE" value="${maxFileSize}" />
      <center>
        <input type="file" name="sqlFile" class="button" /> &nbsp; &nbsp;
      </center>
      <br />
      <input type="submit" name="valid"  value="Recharger la base" class="button" onClick="return confirmImport()"/>
            <input type="hidden" name="action" value="reload" />
    </fieldset>
    </form>
	</td> </tr></table>
    </div>
<br/>
<br/>
		<div id="actionDisplay" align="center"> </div>

EOS;

		return $page;
   
  }
   
}

?>
